type Binary = 0 | 1;

class Block {
  /**
   * #### 逆时针旋转
   * @param blocks 要旋转的块
   * @returns
   */
  static counterClockwiseRotate(blocks: Binary[][]) {
    const length = blocks.length;
    const result: Binary[][] = Array.from({ length }, () =>
      Array.from({ length }, () => 0)
    );

    for (let i = 0; i < length; i++) {
      for (let j = 0; j < length; j++) {
        result[i][j] = blocks[length - 1 - j][i];
      }
    }
    return result;
  }

  /**
   * #### 顺时针旋转
   * @param blocks 要旋转的块
   * @returns
   */
  static clockwiseRotate(blocks: Binary[][]) {
    const length = blocks.length;
    const result: Binary[][] = Array.from({ length }, () =>
      Array.from({ length }, () => 0)
    );

    for (let i = 0; i < length; i++) {
      for (let j = 0; j < length; j++) {
        result[i][j] = blocks[j][length - 1 - i];
      }
    }
    return result;
  }

  /**
   * #### 将二维数组中的数字转换为十进制数
   * @static
   * @param blocks 二维数组
   * @returns
   */
  static Binary2DArrayToDecimalArray(blocks: Binary[][]) {
    // 获取二维数组的长度
    const length = blocks.length;
    // 创建一个空数组，用于存储转换后的十进制数
    const result: number[] = [];
    // 遍历二维数组
    for (let i = 0; i < length; i++) {
      result[i] = this.binaryArrayToDecimal(blocks[i]);
    }
    // 返回转换后的十进制数数组
    return result;
  }

  /**
   * #### 将十进制数组转换为二进制二维数组
   * @param nums 十进制数组
   * @returns
   */
  static decimalArrayToBinary2DArray(nums: number[]) {
    // 获取数组长度
    const length = nums.length;
    // 创建一个空数组，用于存储转换后的二进制数组
    const result: Binary[][] = Array.from({ length }, () =>
      Array.from({ length }, () => 0)
    );
    // 遍历数组
    for (let i = 0; i < length; i++) {
      result[i] = this.decimalToBinaryArray(nums[i]);
    }
    // 返回转换后的二进制数组
    return result;
  }

  /**
   * #### 将十进制数转换为二进制数组
   * @param decimal 十进制数
   * @returns
   */
  static decimalToBinaryArray(decimal: number) {
    // 将十进制数转换为二进制字符串
    const binaryString = decimal.toString(2);
    // 将二进制字符串按字符分割成数组
    const binaryArray = binaryString.split("");
    // 将数组中的每个元素转换为数字类型
    return binaryArray.map(Number) as Binary[];
  }

  /**
   * #### 将二进制数组转换为十进制数
   * @param binaryArray 二进制数组
   * @returns
   */
  static binaryArrayToDecimal(binaryArray: Binary[]) {
    // 将二进制数组转换为字符串，并使用parseInt函数将其转换为十进制数
    return parseInt(binaryArray.join(""), 2);
  }
}

export default Block;
